home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / tools / getstruc.c < prev    next >
Text File  |  1990-07-15  |  1KB  |  71 lines

  1. getstruc(ap, s, b)
  2. char    *ap;        /* structure pointer */
  3. register char    *s;    /* structure format */
  4. register char    *b;    /* sequence of bytes */
  5. {
  6.     register int    i;
  7.     register long    l;
  8.     register char    *p = ap;
  9.     register int    lsb = 1;
  10.     static struct {
  11.         char    a21;
  12.         short    a22;
  13.     } a2;
  14.     static struct {
  15.         char    a41;
  16.         long    a44;
  17.     } a4;
  18.  
  19.     while (i = *s++) {
  20.         switch (i) {
  21.         case '1':
  22.             *p++ = *b++;
  23.             break;
  24.         case '2':
  25.             i = (int) ((char *)&a2.a22 - (char *)&a2) - 1;
  26.             while ((int)(p - ap) & i)
  27.                 p++;
  28.             if (lsb) {
  29.                 i = (b[1] & 0xFF);
  30.                 i <<= 8;
  31.                 i |= (b[0] & 0xFF);
  32.             } else {
  33.                 i = (b[0] & 0xFF);
  34.                 i <<= 8;
  35.                 i |= (b[1] & 0xFF);
  36.             }
  37.             *((short *)p) = i; p += sizeof(short); b += 2;
  38.             break;
  39.         case '4':
  40.             i = (int) ((char *)&a4.a44 - (char *)&a4) - 1;
  41.             while ((int)(p - ap) & i)
  42.                 p++;
  43.             if (lsb) {
  44.                 l = (b[3] & 0xFF);
  45.                 l <<= 8;
  46.                 l |= (b[2] & 0xFF);
  47.                 l <<= 8;
  48.                 l |= (b[1] & 0xFF);
  49.                 l <<= 8;
  50.                 l |= (b[0] & 0xFF);
  51.             } else {
  52.                 l = (b[0] & 0xFF);
  53.                 l <<= 8;
  54.                 l |= (b[1] & 0xFF);
  55.                 l <<= 8;
  56.                 l |= (b[2] & 0xFF);
  57.                 l <<= 8;
  58.                 l |= (b[3] & 0xFF);
  59.             }
  60.             *((long *)p) = l; p += sizeof(long); b += 4;
  61.             break;
  62.         case 'L':
  63.             lsb = 1; break;
  64.         case 'M':
  65.             lsb = 0; break;
  66.         default:
  67.             abort();
  68.         }
  69.     }
  70. }
  71.